#include <iostream>

using namespace std;

class Test 
{
public:
    Test()
    {

    }

    Test(int t) : m_t(t)
    {

    }

    virtual void printInfo() 
    {
        cout << "I am Test!" << endl;
    }
    int m_t;
};

/**
 * 实现的多态的条件：
 * 1、继承
 * 2、函数覆盖（基类、子类拥有相同方法）
 * 3、虚函数：virtual
 * 4、基类指针或者引用指向派生类的对象；
 */
class TestA : public Test
{
public:
    TestA() : Test(100)
    {

    }

    TestA(int ta) : m_ta(ta), Test(100)
    {

    }

    void printInfo()
    {
        cout << "I am TestA" << endl;
    }

    int m_ta;
};

class TestB : public Test
{
public:
    TestB() : Test(1000)
    {

    }

    TestB(int tb) : m_tb(tb), Test(1000)
    {

    }

    virtual void printInfo()  override
    {
        cout << "I am TestB" << endl;
    }

    int m_tb;
};

class TestC : public Test
{
public:
    TestC() : Test(10000)
    {

    }

    TestC(int tc) : m_tc(tc), Test(10000)
    {

    }

    void printInfo()
    {
        cout << "I am TestC" << endl;
    }

    int m_tc;
};

void test(Test &t)  //同一接口，传递不同实例，执行不同操作
{
    t.printInfo();  ////同一接口，传递不同实例，执行不同操作
}


int main(int argc, char **argv)
{
    Test t(1);
    TestA ta(2);
    TestB tb(3);
    TestC tc(4);

    test(t);
    test(ta);
    test(tb);
    test(tc);

    t = ta;
    cout << t.m_t << endl;
    t.printInfo();

    Test *pt = &t;
    TestA *pta = &ta;

    pt = pta;
    pt->printInfo();

    pt = &tb;
    pt->printInfo();

    Test &rt = ta;
    rt.printInfo();

    Test &rt2 = tb;
    rt2.printInfo();

    
    return 0;
}